﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using User.EF.Contracts;
using User.EF.Model;
using User.Global.Contracts.Message;
using User.Global.Resources;
using User.Web.Common.WebAttributes;
using User.Web.Contracts.Model.Account;
using User.Web.Models.Helper;

namespace User.Web.Models.Account
{
    /// <summary>
    /// Model zum Anzeigen und Bearbeiten des aktuellen Benutzters
    /// </summary>
    public class MemberEditModel : ModelBase, IMemberEditModel
    {
        #region Member
        /// <summary>
        /// MemberTitle, bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Title")]
        public IEnumerable<SelectListItem> MemberTitles
        {
            get
            {
               TitleHelper helper = new TitleHelper();
                return helper.GetTitles();
            }
        }

        /// <summary>
        /// Die Anrede die in der Oberfläche ausgewählt wird (der Value) wird in dieser variable abgelegt, d.h. wenn kein Wert ausgewählt wurde
        /// dann wird auch die hier angegebene Fehlermeldung auf der Oberfläche angezeigt. Wird auch benutzt um die currentselection der Dropdownliste anzuzeigen,
        /// da das Property Selected des SelectedListItem nicht funktioniert!
        /// ACHTUNG der Propertyname darf nicht Title sein, da sonst die Validierung nicht funktioniert!
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Title")]
        public string MemberTitle { get; set; }

        /// <summary>
        /// Der Username des aktuellen Users - Nur zum Anzeigen!
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Username")]
        [HtmlAttributes(CssClass = "form-control", Required = true, Placeholder = "Email (Username)")]
        public string Username { get; set; }

        /// <summary>
        /// Der Vorname des aktuellen Users
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Firstname")]
        [HtmlAttributes(CssClass = "form-control", Placeholder = "Vorname")]
        public string FirstName { get; set; }

        /// <summary>
        /// der Nachname des aktuellen Users
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Lastname")]
        [HtmlAttributes(CssClass = "form-control", Placeholder = "Nachname")]
        public string LastName { get; set; }

        /// <summary>
        /// Die Telefonnumer des aktuellen Users
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Phone")]
        [HtmlAttributes(CssClass = "form-control",  Placeholder = "Telefon")]
        public string Mobile { get; set; }
        #endregion

        #region Initialize
        public MemberEditModel()
        {
            FirstName = string.Empty;
            LastName = string.Empty;
            MemberTitle = string.Empty;
            Mobile = string.Empty;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Laden der passenden Modeldaten aus der Datenbank.
        /// </summary>
        /// <param name="query">Die aktuellen Queries die uns zur Verfügung stehen</param>
        /// <param name="userId">die UserId für die die Änderungen vorgenommen werden sollen</param>
        public bool Load(IWebQuerySummary query, long userId)
        {
            Member user = query.MembershipQueries.GetMemberById(userId);
            if (user != null)
            {
                Username = user.Username;
                //Wenn für den User bereits Daten hinterlegt wurden, diese hier laden.
                if (user.MemberExtension != null)
                {
                    Mobile = user.MemberExtension.Mobilenumber;
                    FirstName = user.MemberExtension.Firstname;
                    LastName = user.MemberExtension.Lastname;
                    MemberTitle = user.MemberExtension.Title.ToString();
                }

                if (string.IsNullOrEmpty(Username))
                {
                    Username = user.MemberOAuth != null ? InputFieldNames.Provider + " - " + user.MemberOAuth.Provider : DefaultMessages.KeinAngabe;
                }
                else
                {
                    //Username und Provider angeben, wenn beides verbunden wurde.
                    Username += user.MemberOAuth != null ? string.Format(" ({0})", user.MemberOAuth.Provider) : string.Empty;
                }

                //AddMessage.Add(DefaultMessages.UserLoadedSuccessFully, MessageTypes.message);
                return true;
            }

            AddMessage.Add(ErrorMessages.UserDontExists, MessageTypes.error);
            return false;
        }

        /// <summary>
        /// Speichern der Userdaten anhand der aktuellen Modeldaten.
        /// </summary>
        /// <param name="query">Die aktuellen Queries die uns zur Verfügung stehen</param>
        /// <param name="userId">die UserId für die die Änderungen vorgenommen werden sollen</param>
        public bool Save(IWebQuerySummary query, long userId)
        {
            //Den User anhand der Id ermitteln.
            Member user = query.MembershipQueries.GetMemberById(userId);
            if (user != null)
            {
                //Prüfen ob bereits eine Extension für den Benutzer existiert.
                if (user.MemberExtension == null)
                {
                    user.MemberExtension = new MemberExtension();
                }

                user.MemberExtension.Firstname = FirstName ?? string.Empty;
                user.MemberExtension.Lastname = LastName ?? string.Empty;
                user.MemberExtension.Mobilenumber = Mobile ?? string.Empty;
                user.MemberExtension.Title = ETitle.None;
                //Den passenden Titel ermitteln.
                if (!string.IsNullOrEmpty(MemberTitle))
                {
                    ETitle title = ETitle.None;
                    if (Enum.TryParse(MemberTitle, true, out title))
                    {
                        user.MemberExtension.Title = title;
                    }
                }

                if (query.Save())
                {
                    AddMessage.Add(DefaultMessages.SavesuccessFull, MessageTypes.ok);
                    return true;
                }
            }

            AddMessage.Add(ErrorMessages.UserSaveError, MessageTypes.error);
            return false;
        }
        #endregion
    }
}
